const path = require('path')
const multer = require('multer')
const mime = require('mime')
const randomstring = require("randomstring")

let filename = ''

// 定义文件夹的名字，和文件的名字
const storage = multer.diskStorage({
  destination(req, file, cb) {
    cb(null, path.resolve(__dirname, '../public/uploads'))
  },
  filename(req, file, cb) {
    filename = randomstring.generate(10) + '.' + mime.getExtension(file.mimetype)
    cb(null, filename)
  }
})

// 对上传的文件进行约束
const limits = {
  fileSize: 2 * 1024 * 1024,
  files: 1
}

const fileFilter = (req, file, cb) => {

  // 这个函数应该调用 `cb` 用boolean值来
  // 指示是否应接受该文件

  // // 拒绝这个文件，使用`false`，像这样:
  // cb(null, false)

  // // 接受这个文件，使用`true`，像这样:
  // cb(null, true)

  const extention = mime.getExtension(file.mimetype)

  if (extention === 'jpeg' || extention === 'jpg' || extention === 'png' || extention === 'gif') {
    cb(null, true)
  } else {
    // 如果有问题，你可以总是这样发送一个错误:
    cb(new Error('I don\'t have a clue!'))
  }
}


// 捕获错误
const upload = multer({
  storage,
  limits,
  fileFilter
}).single('avatar')

const fail = (res) => {
  res.render('fail', {
    data: JSON.stringify({
      msg: '文件上传失败.'
    })
  })
}

const uploadMidd = function (req, res, next) {
  upload(req, res, function (err) {
    if (err instanceof multer.MulterError) {
      fail(res)
    } else if (err) {
      fail(res)
    } else {
      // 通过在req上面绑定数据，来实现中间件间的数据传输
      req.body.filename = filename
      next()
    }
  })
}

module.exports = uploadMidd